// Copyright 2023 The titan Authors. All rights reserved.

// Project: titan
// IDE: GoLand
// Author: fucaihe@outlook.com
// File: news_index.go
// Date: 2023/12/21 13:53:26
// Description: RPC接口 - 新闻数据索引

package api

import (
	"context"
	"strings"

	"github.com/pkg/errors"

	"titan/internal/service"
)

// NewsIndex 数据索引接口对象
type NewsIndex struct {
	*API
	Service service.NewsIndexService
}

// NewsIndexArgs 接口参数
type NewsIndexArgs struct {
	Link string // 文章链接
}

// NewsIndexReply 返回结果
type NewsIndexReply struct {
	Result bool // true: 已存在, false: 不存在
}

// NewsIndexAPI 数据索引接口
type NewsIndexAPI interface {
	// CheckDuplicate 检查数据是否重复
	CheckDuplicate(ctx context.Context, args *NewsIndexArgs, reply *NewsIndexReply) error

	// Insert 插入索引数据
	Insert(ctx context.Context, args *NewsIndexArgs, reply *NewsIndexReply) error
}

// CheckDuplicate 检查数据是否重复
func (n *NewsIndex) CheckDuplicate(ctx context.Context, args *NewsIndexArgs, reply *NewsIndexReply) error {
	link := strings.TrimSpace(args.Link)
	if link == "" {
		return errors.New("Bad Request")
	}

	// 是否重复
	exists, err := n.Service.CheckDuplicate(ctx, link)
	if err != nil {
		return err
	}

	reply.Result = exists

	// n.Service.Insert(ctx, link)

	return nil
}

// Insert 插入索引数据
func (n *NewsIndex) Insert(ctx context.Context, args *NewsIndexArgs, reply *NewsIndexReply) error {
	// 链接去掉协议
	link := strings.TrimSpace(args.Link)
	if link == "" {
		return errors.New("Bad Request")
	}

	b, err := n.Service.Insert(ctx, link)
	if err != nil {
		return err
	}

	reply.Result = b

	return nil
}

// NewNewsIndex 新建一个数据索引
func NewNewsIndex(a *API, nis service.NewsIndexService) NewsIndexAPI {
	return &NewsIndex{
		API:     a,
		Service: nis,
	}
}
